/*
	Exemplos para compreendimento da função: getaddrinfo
	Não tem o foco de compilação
*/

//	cabeçalhos:
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

//	protótipo:
int getaddrinfo(const char *node,     // e.g. "www.example.com" or IP
                const char *service,  // e.g. "http" or port number
                const struct addrinfo *hints,
                struct addrinfo **res);
                
//	explicação :
/*	
	[Provavelmente usaremos no cliente]
	Usado para:
	- preparar um endereço IP para uso
	- host name lookups
	- service names lookups
	
	Três parâmetros de entrada são passados:
	- node: é um host name ou endereço IP
	- service: pode ser um número de porta ou o nome de algum serviço (protocolo). Exs.: "80"; "http"
	- hints: ponteiro para uma estrutura "addrinfo" já preenchida com alguma informação relevante
	
	Como parâmetro de saída:
	- res: um ponteiro para uma lista ligada obtém o resultado
	
	Retorno:
	- 0 (zero) em caso de sucesso; em caso de falha retorna o id do erro.

	Funções de apoio:
	 gai_strerror()						: string contendo descrição do erro, caso ocorra na chamada do getaddrinfo();
	 freeaddrinfo(addrinfo *servinfo)	: libera o espaço usado pela lista ligada apontada por *servinfo

*/

//	exemplos:

/* ex.1 */
int status;
struct addrinfo hints;
struct addrinfo *servinfo;  // vai apontar para os resultados

memset(&hints, 0, sizeof hints);	// garante que a estrutura fica vazia
hints.ai_family = AF_UNSPEC;		// não importa, poderia ser AF_INET (IP), ou AF_INET6 (IPv6), ...
									// usar AF_UNSPEC aumenta a compatibilidade com IPv6 (e outros)
hints.ai_socktype = SOCK_STREAM;	// TCP stream sockets
hints.ai_flags = AI_PASSIVE;		// diz para que o SO atribua o meu endereço local

if ((status = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) { // verificação de erro.
	// no lugar do 'NULL' na chamada acima, poderia ser passado o endereço IP,
	// neste caso ele sobrescreveria a informação contida na estrutura 'hints'
    fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
    exit(1);
}

// servinfo agora aponta para uma lsta ligada com 1 ou mais estruturas addrinfos

// ... faça tudo até vc não precisar do servinfo mais ...

freeaddrinfo(servinfo); // libera a lista ligada

/* ex.2 */
int status;
struct addrinfo hints;
struct addrinfo *servinfo;  // will point to the results

memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_UNSPEC;     // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets

// get ready to connect
status = getaddrinfo("www.example.net", "3490", &hints, &servinfo);

// servinfo now points to a linked list of 1 or more struct addrinfos

// etc.

